home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch14 / Bspline2.frm < prev    next >
Text File  |  1999-06-25  |  21KB  |  785 lines

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
  3. Begin VB.Form frmBspline2 
  4.    Appearance      =   0  'Flat
  5.    BackColor       =   &H00C0C0C0&
  6.    Caption         =   "Bspline2 []"
  7.    ClientHeight    =   6750
  8.    ClientLeft      =   300
  9.    ClientTop       =   840
  10.    ClientWidth     =   9645
  11.    BeginProperty Font 
  12.       Name            =   "MS Sans Serif"
  13.       Size            =   8.25
  14.       Charset         =   0
  15.       Weight          =   700
  16.       Underline       =   0   'False
  17.       Italic          =   0   'False
  18.       Strikethrough   =   0   'False
  19.    EndProperty
  20.    ForeColor       =   &H80000008&
  21.    KeyPreview      =   -1  'True
  22.    LinkTopic       =   "Form1"
  23.    PaletteMode     =   1  'UseZOrder
  24.    ScaleHeight     =   6750
  25.    ScaleWidth      =   9645
  26.    Begin MSComDlg.CommonDialog dlgFile 
  27.       Left            =   3600
  28.       Top             =   1560
  29.       _ExtentX        =   847
  30.       _ExtentY        =   847
  31.       _Version        =   393216
  32.    End
  33.    Begin VB.PictureBox picZY 
  34.       AutoRedraw      =   -1  'True
  35.       Height          =   3135
  36.       Left            =   6480
  37.       ScaleHeight     =   3075
  38.       ScaleWidth      =   3075
  39.       TabIndex        =   15
  40.       Top             =   3600
  41.       Width           =   3135
  42.    End
  43.    Begin VB.PictureBox picXY 
  44.       AutoRedraw      =   -1  'True
  45.       Height          =   3135
  46.       Left            =   3240
  47.       ScaleHeight     =   3075
  48.       ScaleWidth      =   3075
  49.       TabIndex        =   12
  50.       Top             =   3600
  51.       Width           =   3135
  52.    End
  53.    Begin VB.PictureBox picXZ 
  54.       AutoRedraw      =   -1  'True
  55.       Height          =   3135
  56.       Left            =   0
  57.       ScaleHeight     =   3075
  58.       ScaleWidth      =   3075
  59.       TabIndex        =   11
  60.       Top             =   3600
  61.       Width           =   3135
  62.    End
  63.    Begin VB.Frame Frame2 
  64.       Caption         =   "Options"
  65.       Height          =   975
  66.       Left            =   0
  67.       TabIndex        =   7
  68.       Top             =   840
  69.       Width           =   3855
  70.       Begin VB.CheckBox chkShowControlGrid 
  71.          Caption         =   "Show Control Grid"
  72.          Height          =   255
  73.          Left            =   240
  74.          TabIndex        =   10
  75.          Top             =   600
  76.          Value           =   1  'Checked
  77.          Width           =   2055
  78.       End
  79.       Begin VB.CommandButton cmdDraw 
  80.          Caption         =   "Draw"
  81.          Height          =   375
  82.          Left            =   2760
  83.          TabIndex        =   9
  84.          Top             =   360
  85.          Width           =   975
  86.       End
  87.       Begin VB.CheckBox chkShowControlPoints 
  88.          Caption         =   "Show Control Points"
  89.          Height          =   255
  90.          Left            =   240
  91.          TabIndex        =   8
  92.          Top             =   240
  93.          Value           =   1  'Checked
  94.          Width           =   2055
  95.       End
  96.    End
  97.    Begin VB.Frame Frame1 
  98.       Caption         =   "Points"
  99.       Height          =   735
  100.       Left            =   0
  101.       TabIndex        =   1
  102.       Top             =   0
  103.       Width           =   3855
  104.       Begin VB.CommandButton cmdInitialize 
  105.          Caption         =   "Initialize"
  106.          Height          =   375
  107.          Left            =   2760
  108.          TabIndex        =   6
  109.          Top             =   240
  110.          Width           =   975
  111.       End
  112.       Begin VB.TextBox txtNumZ 
  113.          Height          =   285
  114.          Left            =   2160
  115.          TabIndex        =   5
  116.          Text            =   "4"
  117.          Top             =   240
  118.          Width           =   495
  119.       End
  120.       Begin VB.TextBox txtNumX 
  121.          Height          =   285
  122.          Left            =   840
  123.          TabIndex        =   4
  124.          Text            =   "4"
  125.          Top             =   240
  126.          Width           =   495
  127.       End
  128.       Begin VB.Label Label1 
  129.          Caption         =   "NumZ"
  130.          Height          =   255
  131.          Index           =   1
  132.          Left            =   1560
  133.          TabIndex        =   3
  134.          Top             =   240
  135.          Width           =   615
  136.       End
  137.       Begin VB.Label Label1 
  138.          Caption         =   "NumX"
  139.          Height          =   255
  140.          Index           =   0
  141.          Left            =   240
  142.          TabIndex        =   2
  143.          Top             =   240
  144.          Width           =   615
  145.       End
  146.    End
  147.    Begin VB.PictureBox picCanvas 
  148.       AutoRedraw      =   -1  'True
  149.       Height          =   3135
  150.       Left            =   3960
  151.       ScaleHeight     =   205
  152.       ScaleMode       =   3  'Pixel
  153.       ScaleWidth      =   373
  154.       TabIndex        =   0
  155.       Top             =   0
  156.       Width           =   5655
  157.    End
  158.    Begin VB.Label Label2 
  159.       Alignment       =   2  'Center
  160.       Caption         =   "Z-Y (side view)"
  161.       Height          =   255
  162.       Index           =   3
  163.       Left            =   6480
  164.       TabIndex        =   16
  165.       Top             =   3240
  166.       Width           =   3135
  167.    End
  168.    Begin VB.Label Label2 
  169.       Alignment       =   2  'Center
  170.       Caption         =   "X-Y (side view)"
  171.       Height          =   255
  172.       Index           =   1
  173.       Left            =   3240
  174.       TabIndex        =   14
  175.       Top             =   3240
  176.       Width           =   3135
  177.    End
  178.    Begin VB.Label Label2 
  179.       Alignment       =   2  'Center
  180.       Caption         =   "X-Z (top view)"
  181.       Height          =   255
  182.       Index           =   0
  183.       Left            =   0
  184.       TabIndex        =   13
  185.       Top             =   3240
  186.       Width           =   3135
  187.    End
  188.    Begin VB.Menu mnuFile 
  189.       Caption         =   "&File"
  190.       Begin VB.Menu mnuFileOpen 
  191.          Caption         =   "&Open..."
  192.          Shortcut        =   ^O
  193.       End
  194.       Begin VB.Menu mnuFileSave 
  195.          Caption         =   "&Save..."
  196.          Shortcut        =   ^S
  197.       End
  198.       Begin VB.Menu mnuFileExitSep 
  199.          Caption         =   "-"
  200.       End
  201.       Begin VB.Menu mnuFileExit 
  202.          Caption         =   "E&xit"
  203.       End
  204.    End
  205. End
  206. Attribute VB_Name = "frmBspline2"
  207. Attribute VB_GlobalNameSpace = False
  208. Attribute VB_Creatable = False
  209. Attribute VB_PredeclaredId = True
  210. Attribute VB_Exposed = False
  211. Option Explicit
  212.  
  213. Private Const GAP = 0.2
  214.  
  215. ' Location of viewing eye.
  216. Private EyeR As Single
  217. Private EyeTheta As Single
  218. Private EyePhi As Single
  219.  
  220. Private Const Dtheta = PI / 20
  221. Private Const Dphi = PI / 20
  222. Private Const Dr = 1
  223.  
  224. ' Location of focus point.
  225. Private Const FocusX = 0#
  226. Private Const FocusY = 0#
  227. Private Const FocusZ = 0#
  228.  
  229. Private Projector(1 To 4, 1 To 4) As Single
  230.  
  231. Private TheSurface As Bspline3d
  232.  
  233. Private NumX As Integer
  234. Private NumZ As Integer
  235. Private PtX() As Single
  236. Private PtY() As Single
  237. Private PtZ() As Single
  238.  
  239. Private DragPicture As Integer
  240. Private DragI As Integer
  241. Private DragJ As Integer
  242. Private DragX As Single
  243. Private DragY As Single
  244.  
  245. ' Load data from this file.
  246. Private Sub LoadBsplineData(ByVal file_name As String, ByVal file_title As String)
  247. Dim fnum As Integer
  248. Dim i As Integer
  249. Dim j As Integer
  250.  
  251.     On Error GoTo LoadError
  252.     fnum = FreeFile
  253.     Open file_name For Input As fnum
  254.  
  255.     ' Get the number of points.
  256.     Input #fnum, NumX, NumZ
  257.  
  258.     ' Initialize the data.
  259.     txtNumX.Text = Format$(NumX)
  260.     txtNumZ.Text = Format$(NumZ)
  261.  
  262.     ' Prepare to save the data.
  263.     cmdInitialize_Click
  264.  
  265.     ' Read the control point locations.
  266.     For i = 1 To NumX
  267.         For j = 1 To NumZ
  268.             Input #fnum, PtX(i, j), PtY(i, j), PtZ(i, j)
  269.         Next j
  270.     Next i
  271.  
  272.     Close fnum
  273.  
  274.     ' Draw the control points.
  275.     DrawSideViews
  276.     picCanvas.Cls
  277.  
  278.     Caption = "Bspline2 [" & file_title & "]"
  279.     Exit Sub
  280.  
  281. LoadError:
  282.     MsgBox "Error " & Format$(Err.Number) & _
  283.         " loading data." & vbCrLf & _
  284.         Err.Description
  285.     Exit Sub
  286. End Sub
  287. ' Save data into this file.
  288. Private Sub SaveBsplineData(ByVal file_name As String, ByVal file_title As String)
  289. Dim fnum As Integer
  290. Dim i As Integer
  291. Dim j As Integer
  292.  
  293.     On Error GoTo SaveError
  294.     fnum = FreeFile
  295.     Open file_name For Output As fnum
  296.  
  297.     ' Save the number of points.
  298.     Write #fnum, NumX, NumZ
  299.  
  300.     ' Save the control point locations.
  301.     For i = 1 To NumX
  302.         For j = 1 To NumZ
  303.             Write #fnum, PtX(i, j), PtY(i, j), PtZ(i, j)
  304.         Next j
  305.     Next i
  306.  
  307.     Close fnum
  308.     Caption = "Bspline2 [" & file_title & "]"
  309.  
  310.     Exit Sub
  311.  
  312. SaveError:
  313.     MsgBox "Error " & Format$(Err.Number) & _
  314.         " saving data file." & vbCrLf & _
  315.         Err.Description
  316.     Exit Sub
  317. End Sub
  318.  
  319. Private Sub Form_Resize()
  320. Dim wid As Single
  321.  
  322.     wid = ScaleWidth - picCanvas.Left
  323.     If wid < 120 Then wid = 120
  324.     picCanvas.Width = wid
  325. End Sub
  326.  
  327. ' Load a Bspline surface data file.
  328. Private Sub mnuFileOpen_Click()
  329. Dim file_name As String
  330.  
  331.     ' Allow the user to pick a file.
  332.     On Error Resume Next
  333.     dlgFile.Flags = _
  334.         cdlOFNExplorer Or _
  335.         cdlOFNLongNames Or _
  336.         cdlOFNFileMustExist Or _
  337.         cdlOFNHideReadOnly
  338.     dlgFile.ShowOpen
  339.     If Err.Number = cdlCancel Then
  340.         Exit Sub
  341.     ElseIf Err.Number <> 0 Then
  342.         MsgBox "Error selecting file.", , vbExclamation
  343.         Exit Sub
  344.     End If
  345.     On Error GoTo 0
  346.  
  347.     file_name = Trim$(dlgFile.FileName)
  348.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  349.         - Len(dlgFile.FileTitle) - 1)
  350.  
  351.     ' Load the information.
  352.     LoadBsplineData file_name, dlgFile.FileTitle
  353. End Sub
  354. ' Save a Bspline surface data file.
  355. Private Sub mnuFileSave_Click()
  356. Dim file_name As String
  357.  
  358.     ' Allow the user to pick a file.
  359.     On Error Resume Next
  360.     dlgFile.Flags = _
  361.         cdlOFNExplorer Or _
  362.         cdlOFNLongNames Or _
  363.         cdlOFNOverwritePrompt Or _
  364.         cdlOFNHideReadOnly
  365.     dlgFile.ShowSave
  366.     If Err.Number = cdlCancel Then
  367.         Exit Sub
  368.     ElseIf Err.Number <> 0 Then
  369.         MsgBox "Error selecting file.", , vbExclamation
  370.         Exit Sub
  371.     End If
  372.     On Error GoTo 0
  373.  
  374.     file_name = Trim$(dlgFile.FileName)
  375.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  376.         - Len(dlgFile.FileTitle) - 1)
  377.  
  378.     ' Save the information.
  379.     SaveBsplineData file_name, dlgFile.FileTitle
  380. End Sub
  381.  
  382. ' Display the surface.
  383. Private Sub DrawData(pic As Object)
  384. Dim S(1 To 4, 1 To 4) As Single
  385. Dim T(1 To 4, 1 To 4) As Single
  386. Dim ST(1 To 4, 1 To 4) As Single
  387. Dim PST(1 To 4, 1 To 4) As Single
  388.  
  389.     If TheSurface Is Nothing Then Exit Sub
  390.  
  391.     MousePointer = vbHourglass
  392.     Refresh
  393.  
  394.     TheSurface.DrawControls = (chkShowControlPoints.value = vbChecked)
  395.     TheSurface.DrawGrid = (chkShowControlGrid.value = vbChecked)
  396.  
  397.     ' Scale and translate so it looks OK in pixels.
  398.     m3Scale S, 30, -30, 1
  399.     m3Translate T, 200, 100, 0
  400.     m3MatMultiplyFull ST, S, T
  401.     m3MatMultiplyFull PST, Projector, ST
  402.  
  403.     ' Transform the points.
  404.     TheSurface.ApplyFull PST
  405.  
  406.     ' Prevent overflow errors when drawing lines
  407.     ' too far out of bounds.
  408.     On Error Resume Next
  409.  
  410.     ' Display the data.
  411.     pic.Cls
  412.     TheSurface.Draw pic, EyeR
  413.  
  414.     picCanvas.SetFocus
  415.     MousePointer = vbDefault
  416. End Sub
  417. ' Draw the X-Z plane projection of the
  418. ' control points.
  419. Private Sub DrawXZ()
  420. Dim i As Integer
  421. Dim j As Integer
  422.  
  423.     For i = 1 To NumX
  424.         For j = 1 To NumZ
  425.             picXZ.Line (PtX(i, j) - GAP / 2, PtZ(i, j) - GAP / 2)-Step(GAP, GAP), vbBlack, BF
  426.         Next j
  427.     Next i
  428. End Sub
  429. ' Draw the X-Y plane projection of the
  430. ' control points.
  431. Private Sub DrawSideViews()
  432. Dim i As Integer
  433. Dim j As Integer
  434.  
  435.     picXZ.Cls
  436.     picXY.Cls
  437.     picZY.Cls
  438.  
  439.     ' Draw the points.
  440.     For i = 1 To NumX
  441.         For j = 1 To NumZ
  442.             picXZ.Line (PtX(i, j) - GAP / 2, PtZ(i, j) - GAP / 2)-Step(GAP, GAP), vbBlack, BF
  443.             picXY.Line (PtX(i, j) - GAP / 2, PtY(i, j) - GAP / 2)-Step(GAP, GAP), vbBlack, BF
  444.             picZY.Line (PtZ(i, j) - GAP / 2, PtY(i, j) - GAP / 2)-Step(GAP, GAP), vbBlack, BF
  445.         Next j
  446.     Next i
  447.  
  448.     ' Draw the lines.
  449.     For i = 1 To NumX
  450.         picXY.CurrentX = PtX(i, 1)
  451.         picXY.CurrentY = PtY(i, 1)
  452.         picXZ.CurrentX = PtX(i, 1)
  453.         picXZ.CurrentY = PtZ(i, 1)
  454.         picZY.CurrentX = PtZ(i, 1)
  455.         picZY.CurrentY = PtY(i, 1)
  456.         For j = 2 To NumZ
  457.             picXY.Line -(PtX(i, j), PtY(i, j))
  458.             picXZ.Line -(PtX(i, j), PtZ(i, j))
  459.             picZY.Line -(PtZ(i, j), PtY(i, j))
  460.         Next j
  461.     Next i
  462.  
  463.     For j = 1 To NumZ
  464.         picXY.CurrentX = PtX(1, j)
  465.         picXY.CurrentY = PtY(1, j)
  466.         picXZ.CurrentX = PtX(1, j)
  467.         picXZ.CurrentY = PtZ(1, j)
  468.         picZY.CurrentX = PtZ(1, j)
  469.         picZY.CurrentY = PtY(1, j)
  470.         For i = 2 To NumX
  471.             picXY.Line -(PtX(i, j), PtY(i, j))
  472.             picXZ.Line -(PtX(i, j), PtZ(i, j))
  473.             picZY.Line -(PtZ(i, j), PtY(i, j))
  474.         Next i
  475.     Next j
  476. End Sub
  477. ' Draw the spline.
  478. Private Sub cmdDraw_Click()
  479.     CreateData
  480.     DrawData picCanvas
  481. End Sub
  482.  
  483. ' Initialize the points array.
  484. Private Sub cmdInitialize_Click()
  485. Dim i As Integer
  486. Dim j As Integer
  487. Dim xmin As Single
  488. Dim ymin As Single
  489. Dim zmin As Single
  490. Dim dx As Single
  491. Dim dz As Single
  492. Dim dy As Single
  493.  
  494.     NumX = CInt(txtNumX.Text)
  495.     NumZ = CInt(txtNumZ.Text)
  496.     ReDim PtX(1 To NumX, 1 To NumZ)
  497.     ReDim PtY(1 To NumX, 1 To NumZ)
  498.     ReDim PtZ(1 To NumX, 1 To NumZ)
  499.  
  500.     ' Spread the points around slightly.
  501.     xmin = picXZ.ScaleLeft
  502.     dx = picXZ.ScaleWidth / (NumX + 2)
  503.     zmin = picXZ.ScaleTop
  504.     dz = picXZ.ScaleHeight / (NumZ + 2)
  505.     ymin = 0
  506.     dy = GAP * 1.5
  507.     For i = 1 To NumX
  508.         For j = 1 To NumZ
  509.             PtX(i, j) = xmin + i * dx
  510.             PtY(i, j) = ymin + (i + j) * dy
  511.             PtZ(i, j) = zmin + j * dz
  512.         Next j
  513.     Next i
  514.  
  515.     DrawSideViews
  516. End Sub
  517. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  518.     Select Case KeyCode
  519.         Case vbKeyLeft
  520.             EyeTheta = EyeTheta - Dtheta
  521.  
  522.         Case vbKeyRight
  523.             EyeTheta = EyeTheta + Dtheta
  524.  
  525.         Case vbKeyUp
  526.             EyePhi = EyePhi - Dphi
  527.  
  528.         Case vbKeyDown
  529.             EyePhi = EyePhi + Dphi
  530.  
  531.         Case Else
  532.             Exit Sub
  533.     End Select
  534.  
  535.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  536.     DrawData picCanvas
  537. End Sub
  538. Private Sub Form_KeyPress(KeyAscii As Integer)
  539.     Select Case KeyAscii
  540.         Case Asc("+")
  541.             EyeR = EyeR + Dr
  542.         
  543.         Case Asc("-")
  544.             EyeR = EyeR - Dr
  545.         
  546.         Case Else
  547.             Exit Sub
  548.     End Select
  549.  
  550.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  551.     DrawData picCanvas
  552. End Sub
  553.  
  554. Private Sub Form_Load()
  555.     ' Initialize the file dialog.
  556.     dlgFile.InitDir = App.Path
  557.     dlgFile.CancelError = True
  558.     dlgFile.Filter = _
  559.         "Bspline Files (*.bsp)|*.bsp|" & _
  560.         "All Files (*.*)|*.*"
  561.  
  562.     ' Initialize the eye position.
  563.     EyeR = 10
  564.     EyeTheta = PI * 1.2
  565.     EyePhi = PI * 0.1
  566.  
  567.     ' Initialize the projection transformation.
  568.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  569.  
  570.     ' Set some useful scales.
  571.     picXZ.ScaleLeft = -5
  572.     picXZ.ScaleWidth = 10
  573.     picXZ.ScaleTop = 5
  574.     picXZ.ScaleHeight = -10
  575.     picXY.ScaleLeft = -5
  576.     picXY.ScaleWidth = 10
  577.     picXY.ScaleTop = 5
  578.     picXY.ScaleHeight = -10
  579.     picZY.ScaleLeft = -5
  580.     picZY.ScaleWidth = 10
  581.     picZY.ScaleTop = 5
  582.     picZY.ScaleHeight = -10
  583.  
  584.     ' Start with some uninitialized data.
  585.     cmdInitialize_Click
  586.     cmdDraw_Click
  587. End Sub
  588. ' Create the surface.
  589. Private Sub CreateData()
  590. Const GapU = 0.25
  591. Const GapV = 0.25
  592. Const Du = GapU / 1
  593. Const Dv = GapV / 1
  594.  
  595. Dim i As Integer
  596. Dim j As Integer
  597.  
  598.     MousePointer = vbHourglass
  599.     Refresh
  600.  
  601.     Set TheSurface = New Bspline3d
  602.  
  603.     TheSurface.DrawControls = (chkShowControlPoints.value = vbChecked)
  604.     TheSurface.DrawGrid = (chkShowControlGrid.value = vbChecked)
  605.  
  606.     ' Initialize the control points.
  607.     TheSurface.SetBounds NumX, NumZ
  608.     For i = 1 To NumX
  609.         For j = 1 To NumZ
  610.             TheSurface.SetControlPoint i, j, _
  611.                 PtX(i, j), PtY(i, j), PtZ(i, j)
  612.         Next j
  613.     Next i
  614.  
  615.     ' Initialize the B-spline.
  616.     TheSurface.InitializeGrid 3, 3, _
  617.         GapU, GapV, Du, Dv
  618. End Sub
  619. Private Sub chkShowControlPoints_Click()
  620.     DrawData picCanvas
  621. End Sub
  622. Private Sub chkshowcontrolgrid_Click()
  623.     DrawData picCanvas
  624. End Sub
  625. ' Try to drag a node.
  626. Private Sub picXZ_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  627. Dim i As Integer
  628. Dim j As Integer
  629.  
  630.     ' Find the node.
  631.     DragPicture = 0
  632.     For i = 1 To NumX
  633.         For j = 1 To NumZ
  634.             If (Abs(PtX(i, j) - X) < GAP / 2) And _
  635.                (Abs(PtZ(i, j) - Y) < GAP / 2) _
  636.             Then
  637.                 ' This is the node.
  638.                 DragI = i
  639.                 DragJ = j
  640.                 DragPicture = 1
  641.                 Exit For
  642.             End If
  643.         Next j
  644.     Next i
  645.  
  646.     ' See if we found a node.
  647.     If DragPicture < 1 Then Exit Sub
  648.  
  649.     ' Start the drag.
  650.     picXZ.DrawMode = vbInvert
  651.     DragX = X
  652.     DragY = Y
  653.     picXZ.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  654. End Sub
  655. ' Try to drag a node.
  656. Private Sub picXY_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  657. Dim i As Integer
  658. Dim j As Integer
  659.  
  660.     ' Find the node.
  661.     DragPicture = 0
  662.     For i = 1 To NumX
  663.         For j = 1 To NumZ
  664.             If (Abs(PtX(i, j) - X) < GAP / 2) And _
  665.                (Abs(PtY(i, j) - Y) < GAP / 2) _
  666.             Then
  667.                 ' This is the node.
  668.                 DragI = i
  669.                 DragJ = j
  670.                 DragPicture = 2
  671.                 Exit For
  672.             End If
  673.         Next j
  674.     Next i
  675.  
  676.     ' See if we found a node.
  677.     If DragPicture < 1 Then Exit Sub
  678.  
  679.     ' Start the drag.
  680.     picXY.DrawMode = vbInvert
  681.     DragX = X
  682.     DragY = Y
  683.     picXY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  684. End Sub
  685. ' Try to drag a node.
  686. Private Sub picZY_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  687. Dim i As Integer
  688. Dim j As Integer
  689.  
  690.     ' Find the node.
  691.     DragPicture = 0
  692.     For i = 1 To NumX
  693.         For j = 1 To NumZ
  694.             If (Abs(PtZ(i, j) - X) < GAP / 2) And _
  695.                (Abs(PtY(i, j) - Y) < GAP / 2) _
  696.             Then
  697.                 ' This is the node.
  698.                 DragI = i
  699.                 DragJ = j
  700.                 DragPicture = 3
  701.                 Exit For
  702.             End If
  703.         Next j
  704.     Next i
  705.  
  706.     ' See if we found a node.
  707.     If DragPicture < 1 Then Exit Sub
  708.  
  709.     ' Start the drag.
  710.     picZY.DrawMode = vbInvert
  711.     DragX = X
  712.     DragY = Y
  713.     picZY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  714. End Sub
  715.  
  716. ' Continue dragging a node.
  717. Private Sub picXZ_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  718.     If DragPicture <> 1 Then Exit Sub
  719.  
  720.     picXZ.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  721.     DragX = X
  722.     DragY = Y
  723.     picXZ.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  724. End Sub
  725. ' Continue dragging a node.
  726. Private Sub picXY_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  727.     If DragPicture <> 2 Then Exit Sub
  728.  
  729.     picXY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  730.     DragX = X
  731.     DragY = Y
  732.     picXY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  733. End Sub
  734.  
  735. ' Finish dragging a node.
  736. Private Sub picXZ_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  737.     If DragPicture <> 1 Then Exit Sub
  738.     DragPicture = 0
  739.  
  740.     ' Update the node's position and redraw.
  741.     PtX(DragI, DragJ) = X
  742.     PtZ(DragI, DragJ) = Y
  743.     picXZ.DrawMode = vbCopyPen
  744.  
  745.     DrawSideViews
  746. End Sub
  747. ' Finish dragging a node.
  748. Private Sub picXY_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  749.     If DragPicture <> 2 Then Exit Sub
  750.     DragPicture = 0
  751.  
  752.     ' Update the node's position and redraw.
  753.     PtX(DragI, DragJ) = X
  754.     PtY(DragI, DragJ) = Y
  755.     picXY.DrawMode = vbCopyPen
  756.  
  757.     DrawSideViews
  758. End Sub
  759.  
  760. ' Finish dragging a node.
  761. Private Sub picZY_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  762.     If DragPicture <> 3 Then Exit Sub
  763.     DragPicture = 0
  764.  
  765.     ' Update the node's position and redraw.
  766.     PtZ(DragI, DragJ) = X
  767.     PtY(DragI, DragJ) = Y
  768.     picZY.DrawMode = vbCopyPen
  769.  
  770.     DrawSideViews
  771. End Sub
  772.  
  773.  
  774. ' Continue dragging a node.
  775. Private Sub picZY_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  776.     If DragPicture <> 3 Then Exit Sub
  777.  
  778.     picZY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  779.     DragX = X
  780.     DragY = Y
  781.     picZY.Line (DragX - GAP / 2, DragY - GAP / 2)-Step(GAP, GAP), , BF
  782. End Sub
  783.  
  784.  
  785.